package cn.quevo.core.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import cn.quevo.core.lang.StringUtils;


/**
 * 密码加密
 * 
 * @author July july_sky@foxmail.com
 * @date 2016年10月11日下午11:09:53
 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
 */
public final class PasswordEncoder {
	/**
	 * MD5字符
	 */
	public static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
	private final static String PASSWD_SECRET = "QUEVO_SHA";

	/**
	 * SHA256加密方式
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2016年10月11日下午11:09:59
	 * @param password
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String encodeSHA256(final String password) throws NoSuchAlgorithmException{
		if (password == null) {
			return null;
		}
		MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
		messageDigest.update(password.getBytes());
		final byte[] digest = messageDigest.digest();
		return getFormattedText(digest);
	}
	
	/**
	 * MD5加密方式
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2016年10月11日下午11:10:07
	 * @param password
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String encodeMD5(final String password) throws NoSuchAlgorithmException{
		if (password == null) {
			return null;
		}
		MessageDigest messageDigest = MessageDigest.getInstance("MD5");
		messageDigest.update(password.getBytes());
		final byte[] digest = messageDigest.digest();
		return getFormattedText(digest);
	}

	private static String getFormattedText(byte[] bytes) {
		final StringBuilder buf = new StringBuilder(bytes.length * 2);
		for (int j = 0; j < bytes.length; j++) {
			buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
			buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
		}
		return buf.toString().toUpperCase();
	}
	
	/**
	 * 密码验证
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2017年1月2日下午2:53:04
	 * @param passwd
	 * @return
	 */
	public static boolean checkPasswd(String passwd) {
		if (StringUtils.isBlank(passwd) || passwd.length() < 8) {
			return false;
		}
		return true;
	}
	
	/**
	 * 密码加密,随机盐值
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2018年3月19日 下午10:24:45
	 * @param passwd
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String encodePasswd(final String passwd) throws NoSuchAlgorithmException {
	   return encodePasswd(passwd, StringUtils.getRandomStr(4));
	}
	/**
	 * 密码加密，指定盐值
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2018年3月19日 下午10:30:40
	 * @param passwd
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String encodePasswd(final String passwd,final String salt) throws NoSuchAlgorithmException {
        String _passwd = encodeSHA256(PASSWD_SECRET+passwd+salt);
        return "$"+salt+"$"+_passwd;
    } 
	/**
	 * 密码验证
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2018年3月19日 下午10:32:50
	 * @param passwd
	 * @param passwdPlan
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static boolean passwdValidate(final String passwd,final String passwdPlan) throws NoSuchAlgorithmException {
	    if(StringUtils.isBlank(passwd) || StringUtils.isBlank(passwdPlan)) {
	        return false;
	    }
	    if(passwd.equals(passwdPlan)) {
	        return true;
	    }
	    if(passwd.startsWith("$")) {
	        int index = passwd.indexOf("$",1);
	        String salt = passwd.substring(1, index);
	        String confPasswd = encodePasswd(passwdPlan, salt);
	        return passwd.equals(confPasswd);
	    }
	    return passwd.equals(encodeSHA256(passwdPlan));
	}
}
